package kr.co.bettersoft.waitnumbercustomer.activity;

import java.util.Locale;

import kr.co.bettersoft.waitnumbercustomer.common.CommonConstant;
import kr.co.bettersoft.waitnumbercustomer.common.CommonUtils;

import org.apache.http.util.EncodingUtils;

import android.annotation.SuppressLint;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.Rect;
import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.DisplayMetrics;
import android.util.Log;
import android.view.KeyEvent;
import android.view.View;
import android.view.Window;
import android.view.View.OnClickListener;
import android.webkit.JsResult;
import android.webkit.WebChromeClient;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.ProgressBar;
import android.widget.TextView;
import android.widget.Toast;
/**
 * myWebView
 * 웹페이지를 웹뷰에 로딩하여 사용자에게 보여준다.
 *  서버 공지/QnA/이용약관 등에 사용된다.
 */
@SuppressLint("SetJavaScriptEnabled")
public class myWebView extends Activity {
	/////////////////////////////////////////////////////////////////////////////////////////////////////////////
	// 변수
	String TAG = "myWebView";

	// 웹뷰 관련
	String loadingURL = "";
	String webViewTitle = "";
	String postData;
	// 로케일
	Locale systemLocale = null;
	String strCountry = "";
	String strLanguage = "";

	String randomKey = "";

	// 화면 관련
	ProgressBar pb1;		// 중단 로딩 진행바

	// 타이틀바
	View title_layout;
	Button topNaviCloseBtn; 		// 상단 닫기 버튼
	TextView webview_title;		// 상단 타이틀
	
	// 동적 웹뷰
	LinearLayout contents;
	WebView wv;
	///////////////////////////////////////////////////////////////////////////////////////////////////////	

	// 핸들러
	Handler handler = new Handler(){
		@Override
		public void handleMessage(Message msg){
			try{
				Bundle b = msg.getData();		
				if(b.getInt("order")==1){
					// 프로그래스바 실행
					if(pb1==null){
						pb1=(ProgressBar) findViewById(R.id.webview_progressbar1);
					}
					pb1.setVisibility(View.VISIBLE);
				}else if(b.getInt("order")==2){
					// 프로그래스바  종료
					if(pb1==null){
						pb1=(ProgressBar) findViewById(R.id.webview_progressbar1);
					}
					pb1.setVisibility(View.INVISIBLE);
				}
				if(b.getInt("showErrToast")==1){
					Toast.makeText(myWebView.this, getString(R.string.error_message), Toast.LENGTH_SHORT).show();
					// 페이지를 불러오는데 실패했습니다.\n잠시후 다시 시도해주시기 바랍니다.		
				}
			}catch(Exception e){
				e.printStackTrace();
			}
		}
	};
	
	/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		requestWindowFeature( Window.FEATURE_NO_TITLE );
		setContentView(R.layout.my_web_view_activity);
		Intent rIntent = getIntent();
		loadingURL = rIntent.getStringExtra("loadingURL");			// URL 정보를 받음.
//		webViewTitle = rIntent.getStringExtra("webViewTitle");			// 상단 타이틀 정보.
//		title_layout = findViewById(R.id.title_layout);
//		if(webViewTitle==null && webViewTitle.length()<1){
//			// 타이틀바 자체를 숨김
//			title_layout.setVisibility(View.GONE);
//		}else{
//			// 문구 세팅
//			webview_title = (TextView) findViewById(R.id.webview_title);
//			webview_title.setText(webViewTitle);
//			title_layout.setVisibility(View.VISIBLE);
//		}
//		topNaviCloseBtn = (Button) findViewById(R.id.top_navi_close_btn);
//		// 상단 닫기 버튼
//		topNaviCloseBtn.setOnClickListener(new OnClickListener() {
//			@Override
//			public void onClick(View v) {
//				finish();
//			}
//		});
		
		contents = (LinearLayout) findViewById(R.id.webview_linear_layout);
		wv = new WebView(this);
		wv.addJavascriptInterface(new AndroidBridge(), "hybrid");
		wv.getSettings().setJavaScriptEnabled(true);		 // JavaScript 허용.
		wv.setWebViewClient(new MyWebViewClient());  // WebViewClient 지정       
		wv.setWebChromeClient(new MyWebChromeClient());
		wv.getSettings().setPluginsEnabled(true);		// 플러그인 가능
		contents.addView(wv);
		
//		checkDensity();
		
		

		//사용자 지역, 언어
		systemLocale = getResources().getConfiguration().locale;
		strCountry = systemLocale.getCountry();
		strLanguage = systemLocale.getLanguage();
		
		if(loadingURL.length()>0){
			// 비동기 -> 바로 열도록 수정
			postData = "Merchant-Language="+strLanguage+"&Merchant-Country="+strCountry;				 
			wv.postUrl(loadingURL, EncodingUtils.getBytes(postData, "BASE64"));
		}else{
			Toast.makeText(myWebView.this, R.string.cant_find_url, Toast.LENGTH_SHORT).show();
		}
	}

//	public void checkDensity(){
//		//단말 해상도에 따른 M. 페이지 크기 설정
//        DisplayMetrics metrics = new DisplayMetrics();
//        // ((WindowManager)mContext.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay().getMetrics(metrics);
//        // 혹은 액티비티에서는 다음처럼 설정이 가능
//        getWindowManager().getDefaultDisplay().getMetrics(metrics);
//        int screenDensity = metrics.densityDpi;
//        Log.d("density", "screenDensity : "+ screenDensity);
////        if (screenDensity == 240) {
////        	wv.getSettings().setDefaultZoom(WebSettings.ZoomDensity.FAR);
////        } else if (screenDensity == 160) {
////        	wv.getSettings().setDefaultZoom(WebSettings.ZoomDensity.MEDIUM);
////        } else if (screenDensity == 120) {
////        	wv.getSettings().setDefaultZoom(WebSettings.ZoomDensity.CLOSE );
////        }
	
//	// 안드로이드 상단 상태창 사이즈
//	Rect rectgle= new Rect();
//	Window window= getWindow();
//	window.getDecorView().getWindowVisibleDisplayFrame(rectgle);
//	int StatusBarHeight= rectgle.top;
//	int contentViewTop= 
//	    window.findViewById(Window.ID_ANDROID_CONTENT).getTop();
//	int TitleBarHeight= contentViewTop - StatusBarHeight;
//
//	   Log.i("*** Jorgesys :: ", "StatusBar Height= " + StatusBarHeight + " , TitleBar Height = " + TitleBarHeight); 
//	}
	
	@Override 
	public boolean onKeyDown(int keyCode, KeyEvent event) { 
//		Log.d(TAG,"keyCode:"+keyCode+"//event:"+event);
		return super.onKeyDown(keyCode, event);
	};
	/**
	 * MyWebViewClient
	 * 페이지 로드, 완료 이벤트발생 가능한 웹뷰 클라이언트
	 *
	 */
	private class MyWebViewClient extends WebViewClient {
		public boolean shouldOverrideUrlLoading(WebView view, String url) {
			// 마켓 링크 연결
			if(url.contains("market://")){
				Uri uri = Uri.parse(url);  	// ex)"market://details?id=kr.co.bettersoft.checkmileage.activities"
				Intent it = new Intent(Intent.ACTION_VIEW, uri);  
				startActivity(it) ;
			}else if(url.startsWith("http://market.android.com") || url.startsWith("https://market.android.com") ){		// 이거 안하면 웹으로 열림
				Log.d(TAG,"market url::"+url);
				Intent i = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
				startActivity(i);
				return true;
			}else{
				// 일반
				view.loadUrl(url);
			}
			return true;
		}
		/**
		 * onPageFinished
		 * 로딩 끝나면 프로그래스바 숨기고 재로딩 가능하도록한다
		 *
		 * @param view
		 * @param url
		 * @return
		 */
		@Override
		public void onPageFinished(WebView view, String url) {
			super.onPageFinished(view, url);
			hidePb();
		}
		/**
		 * onPageStarted
		 * 웹뷰 로딩 시작하면 시간 재서 로딩 안되면 멈추고 알린다.
		 *
		 * @param view
		 * @param url
		 * @param favicon
		 * @return
		 */
		@Override
		public void onPageStarted(WebView view, String url, Bitmap favicon) {
			super.onPageStarted(view, url, favicon);
			showPb();
			new Thread(new Runnable() {
				@Override
				public void run() {
					randomKey = CommonUtils.getNowDate();
//					Log.d(TAG,"randomKey:"+randomKey);
					checkWebViewLoadedPre(randomKey);
//					try {		// 기다렸다가 체크해서 안끝났으면 중지
//						randomKey = CommonUtils.getNowDate();
//						Log.d(TAG,"randomKey:"+randomKey);
//						Thread.sleep(CommonConstant.serverConnectTimeOut);
//					} catch (InterruptedException e) {
//						e.printStackTrace();
//					}
//					if(randomKey.equals(tempRandomKey)){
//						checkMyWebViewLoaded();
//					}
				}
			}).start();
		}
	}
	public void checkWebViewLoadedPre(String tempKey){
		try {		// 기다렸다가 체크해서 안끝났으면 중지
			Thread.sleep(CommonConstant.serverConnectTimeOut);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		checkMyWebViewLoaded(tempKey);
	}
	
	public void checkMyWebViewLoaded(final String tempKey){
		runOnUiThread(new Runnable(){
			public void run(){
				if(randomKey.equals(tempKey)){
//					Log.d(TAG,"equals:"+tempKey);
					if(wv.getProgress()<100) {
						// do what you want
						wv.stopLoading();
						hidePb();
						showErrMsg();
						finish();
					}
				}
			}
		});
	}
	public void checkMyWebViewLoaded(){
		runOnUiThread(new Runnable(){
			public void run(){
				if(wv.getProgress()<100) {
					// do what you want
					wv.stopLoading();
					hidePb();
					showErrMsg();
					finish();
				}
			}
		});
	}
	/**
	 * WebChromeClient 를 상속하는 클래스이다.
	 * alert 이나 윈도우 닫기 등의 web 브라우저 이벤트를 구하기 위한 클래스이다.
	 * @author johnkim
	 */
	private class MyWebChromeClient extends WebChromeClient {
		//Javascript alert 호출 시 실행
		@Override
		public boolean onJsAlert(WebView view, String url, String message, JsResult result) {
			final JsResult finalRes = result;
			//AlertDialog 생성
			new AlertDialog.Builder(view.getContext())
			.setMessage(message)
			.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
				public void onClick(DialogInterface dialog, int which) {
					finalRes.confirm(); 
				}
			})
			.setCancelable(false)
			.create()
			.show();
			return true;
		}
	}

	/**
	 * Bridge Class
	 * 
	 */
	private class AndroidBridge {
		// 종료
		public void finishActivity(){
			Log.d(TAG,"finish called");
			handler.post(new Runnable() {
				public void run() {
//					mWeb.stopLoading();
					finish();
				}
			});
		}
	}
	///////////////////////////////////////////////////////////////////////////////////////////////////////
	// 유틸

	/**
	 * showPb
	 *  중앙 프로그래스바 가시화한다
	 *
	 * @param
	 * @param
	 * @return
	 */
	public void showPb(){
		new Thread( 
				new Runnable(){
					public void run(){
						Message message = handler .obtainMessage();
						Bundle b = new Bundle();
						b.putInt( "order" , 1);
						message.setData(b);
						handler .sendMessage(message);
					}
				}
		).start();
	}
	/**
	 * hidePb
	 *  중앙 프로그래스바 비가시화한다
	 *
	 * @param
	 * @param
	 * @return
	 */
	public void hidePb(){
		new Thread(
				new Runnable(){
					public void run(){
						Message message = handler .obtainMessage();
						Bundle b = new Bundle();
						b.putInt( "order" , 2);
						message.setData(b);
						handler .sendMessage(message);
					}
				}
		).start();
	}

	/**
	 * showErrMsg
	 *  화면에 error 토스트 띄운다
	 *
	 * @param
	 * @param
	 * @return
	 */
	public void showErrMsg(){			
		new Thread(
				new Runnable(){
					public void run(){
						Message message = handler.obtainMessage();				
						Bundle b = new Bundle();
						b.putInt("showErrToast", 1);
						message.setData(b);
						handler.sendMessage(message);
					}
				}
		).start();
	} 

	/**
	 * onStop
	 *  액티비티 정지할때 웹뷰 로딩도 정지한다
	 *
	 * @param
	 * @param
	 * @return
	 */
	@Override
	public void onStop(){
		if(wv!=null){
			runOnUiThread(new Runnable(){
				public void run(){
					wv.stopLoading();	
				}
			});
		}
		super.onStop();
	}
}
